#include <numeric>
#include <vector>
#include <functional>
#include <iostream>
#include <iterator>

using namespace std;

int main()
{
    int ia[5] = { 1, 2, 3, 4, 5 };
    vector<int> iv(ia, ia + 5);

    // 15 i.e. 0 + 1 + 2 + 3 + 4 + 5
    cout << accumulate(iv.begin(), iv.end(), 0) << endl;

    // -15 i.e. 0 - 1 - 2 - 3 - 4 - 5
    cout << accumulate(iv.begin(), iv.end(), 0, minus<int>()) << endl;

    // 65 i.e. 10 + 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 5 * 5
    cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << endl;

    // -20 i.e. 10 - 1+1 - 2+2 - 3+3 - 4+4 - 5+5
    cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus<int>(), plus<int>()) << endl;

    // 以下这个迭代器绑定到cout，作为输出用
    ostream_iterator<int> oite(cout, " ");

    // 1 3 6 10 15 (局部求和)
    partial_sum(iv.begin(), iv.end(), oite);

    // 1 -1 -4 -8 -13
    partial_sum(iv.begin(), iv.end(), oite, minus<int>());

    // 1 1 1 1 1
    adjacent_difference(iv.begin(), iv.end(), oite);

    // 1 3 5 7 9
    adjacent_difference(iv.begin(), iv.end(), oite, plus<int>());

    int n = 3;
    iota(iv.begin(), iv.end(), n);
    for (int i = 0; i < iv.size(); i++)
        cout << iv[i] << ' '; // 3 4 5 6 7

    return 0;
}